package leetcode.pre50;

/**
 * 给定一个 n × n 的二维矩阵表示一个图像。
 * <p>
 * 将图像顺时针旋转 90 度。
 * <p>
 * 说明：
 * <p>
 * 你必须在原地旋转图像，这意味着你需要直接修改输入的二维矩阵。
 * <p>
 * 请不要使用另一个矩阵来旋转图像。
 * <p>
 * 示例 1:
 * <p>
 * 给定 matrix =
 * [
 * <p>
 * [1,2,3],
 * <p>
 * [4,5,6],
 * <p>
 * [7,8,9]
 * <p>
 * ],
 * <p>
 * 原地旋转输入矩阵，使其变为:
 * [
 * <p>
 * [7,4,1],
 * <p>
 * [8,5,2],
 * <p>
 * [9,6,3]
 * <p>
 * ]
 *
 * @since 2019/11/30 0030 下午 4:45
 */
public class Code48_RotateMatrix {

    public static void main(String[] args) {
        int[][] m = {{1, 2}, {3, 4}};
        int[][] m1 = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
        print(m);
        rotate(m);
        System.out.println("旋转后");
        print(m);
        System.out.println();
        print(m1);
        rotate(m1);
        System.out.println("旋转后");
        print(m1);
    }

    private static void print(int[][] m) {
        for (int i = 0; i < m.length; i++) {
            for (int j = 0; j < m[0].length; j++) {
                System.out.print(m[i][j] + "  ");
            }
            System.out.println();
        }
    }

    public static void rotate(int[][] matrix) {
        if (matrix == null || matrix.length == 0) {
            return;
        }
        //行数
        int row = matrix.length;
        //列数
        int col = matrix[0].length;
        //确保是正方形
        assert row == col;
        //从左上角到右下角一直缩。如果是奇数行，则最中心不用旋转
        for (int i = 0; i < row / 2; i++) {
            doRotate(matrix, i, i, row - 1 - i, row - 1 - i);
        }

    }

    /**
     * @param row1 左上角顶点的坐标
     * @param col1
     * @param row2 右下角顶点的坐标
     * @param col2 (row1,col1) .......
     *             ...................
     *             ........(row2,col2)
     */
    public static void doRotate(int[][] matrix, int row1, int col1, int row2, int col2) {
        int temp;
        for (int i = 0; i < row2 - row1; i++) {
            //记录左上角
            temp = matrix[row1][col1 + i];
            //左下角给左上角
            matrix[row1][col1 + i] = matrix[row2 - i][col1];
            //右下角给左下角
            matrix[row2 - i][col1] = matrix[row2][col2 - i];
            //右上角给右下角
            matrix[row2][col2 - i] = matrix[row1 + i][col2];
            //左上角给右上角
            matrix[row1 + i][col2] = temp;
        }
    }
}
